﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using RRTWSEntityDSD.Dominio;
using WebServiceDSDG6.Persistencia;
using System.Data.SqlClient;
using System.Data;

namespace RRTWSEntityDSD.Dao
{
    public class AsientoDAO : BaseDAO<Asiento, int>
    {
        public List<Asiento> getListarAsientos()
        {
            return ListarTodos().ToList();
        }

        public Asiento getAsientoByID(int id)
        {
            return Obtener(id);
        }


        public List<Asiento> getListaAsientosPorEstadio(int idestadio)
        {

            try
            {
                string query = "SELECT * FROM ASIENTO  where [EST_ID_ESTADIO] =" + idestadio;

                SqlCommand cmd = new SqlCommand(query, cnx);
                cnx.Open();
                using (SqlDataReader dr = cmd.ExecuteReader())
                {

                    List<Asiento> listaAsientos = new List<Asiento>();
                    while (dr.Read())
                    {

                        if (!Convert.IsDBNull(dr["ASI_ID_ASIENTO"]))
                        {
                            Asiento a = new Asiento()
                            {
                                idAsiento = int.Parse(dr["ASI_ID_ASIENTO"].ToString()),
                                numero = dr["ASI_NUMERO"].ToString(),
                                estadio = int.Parse(dr["EST_ID_ESTADIO"].ToString())
                            };
                            listaAsientos.Add(a);
                        }
                    }

                    return listaAsientos;
                }
            }
            catch (Exception e)
            {
                throw new InvalidOperationException("Error de conexiones  ");
            }

            finally
            {
                cnx.Close();
            }
            return null;
        }

        public List<Asiento> getListarAsientosPorEvento(int evento)
        {
            try
            {
                using (SqlCommand cmd = new SqlCommand("TRI_ssf_Asiento", cnx))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@EVE_ID_EVE_DEPORTIVO", evento);
                    //cmd.Parameters.AddWithValue("@ID_ESTADO", id_Estado);
                    cnx.Open();

                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        List<Asiento> listado = new List<Asiento>();
                        while (dr.Read())
                        {
                            Asiento asiento = null;
                            if (!Convert.IsDBNull(dr["ASI_ID_ASIENTO"]))
                            {
                                asiento = new Asiento();
                                asiento.idAsiento = int.Parse(dr["ASI_ID_ASIENTO"].ToString());
                                asiento.numero = dr["ASI_NUMERO"].ToString();
                                if (!Convert.IsDBNull(dr["EST_ID_ESTADIO"]))
                                    asiento.estadio = int.Parse(dr["EST_ID_ESTADIO"].ToString());
                                listado.Add(asiento);
                            }
                        }
                        return listado;

                    }

                }
            }
            catch (InvalidOperationException e)
            {
                throw new InvalidOperationException("Error de conexiones : " + e.Message);
            }
            finally
            {
                cnx.Close();
            }
            return null;
        }

        public Asiento insert(string numero, int estadio)
        {

            Asiento asiento = new Asiento();
            asiento.numero = numero;
            asiento.estadio = estadio;
            return Crear(asiento);
        }

        public Asiento update(int idasiento, string numero, int estadio)
        {
            Asiento asiento = new Asiento() { idAsiento = idasiento, numero = numero, estadio = estadio };

            return Modificar(asiento);
        }

        public Asiento getAsientoDisponiblePorEvento(int id, int evento)
        {
            try
            {
                string query = "select * from ASIENTO asiento where asiento.ASI_ID_ASIENTO = " + id + " and asiento.ASI_ID_ASIENTO not in(select entrada.ASI_ID_ASIENTO from ENTRADA entrada where entrada.EVE_ID_EVENTO  = " + evento + ")";

                SqlCommand cmd = new SqlCommand(query, cnx);
                cnx.Open();

                using (SqlDataReader dr = cmd.ExecuteReader())
                {

                    while (dr.Read())
                    {
                        Asiento asiento = null;
                        if (!Convert.IsDBNull(dr["ASI_ID_ASIENTO"]))
                        {
                            asiento = new Asiento();
                            asiento.idAsiento = int.Parse(dr["ASI_ID_ASIENTO"].ToString());
                            asiento.numero = dr["ASI_NUMERO"].ToString();
                            if (!Convert.IsDBNull(dr["EST_ID_ESTADIO"]))
                                asiento.estadio = int.Parse(dr["EST_ID_ESTADIO"].ToString());
                            return asiento;
                        }
                    }

                }


            }
            catch (InvalidOperationException e)
            {
                throw new InvalidOperationException("Error de conexiones : " + e.Message);
            }
            finally
            {
                cnx.Close();
            }
            return null;
        }

        public List<Asiento> getListaAsientoDisponiblePorEvento(int evento)
        {
            try
            {
                string query = "select * from ASIENTO asiento where asiento.ASI_ID_ASIENTO not in(select entrada.ASI_ID_ASIENTO from ENTRADA entrada where entrada.EVE_ID_EVENTO  = " + evento + ")"+
                    "AND asiento.EST_ID_ESTADIO =  (SELECT EST_ID_ESTADIO FROM EVENTO_DEPORTIVO WHERE EVE_ID_EVE_DEPORTIVO =  " + evento + " )";

                SqlCommand cmd = new SqlCommand(query, cnx);
                cnx.Open();
                List<Asiento> listaAsientos = new List<Asiento>();
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    
                    while (dr.Read())
                    {
                        Asiento asiento = null;
                        if (!Convert.IsDBNull(dr["ASI_ID_ASIENTO"]))
                        {
                            asiento = new Asiento();
                            asiento.idAsiento = int.Parse(dr["ASI_ID_ASIENTO"].ToString());
                            asiento.numero = dr["ASI_NUMERO"].ToString();
                            if (!Convert.IsDBNull(dr["EST_ID_ESTADIO"]))
                                asiento.estadio = int.Parse(dr["EST_ID_ESTADIO"].ToString());
                            listaAsientos.Add(asiento);
                        }
                    }

                   

                }
                return listaAsientos;

            }
            catch (InvalidOperationException e)
            {
                throw new InvalidOperationException("Error de conexiones : " + e.Message);
            }
            finally
            {
                cnx.Close();
            }
            return null;
        }

        public List<Asiento> listarAsientosPorClientePorEvento(string cliente, string evento, string pago)
        {
            try
            {
                string query = " SELECT * FROM ASIENTO WHERE ASI_ID_ASIENTO IN "+
                                " (SELECT ASI_ID_ASIENTO FROM ENTRADA WHERE EVE_ID_EVENTO = "+evento+" AND  OPE_ID_OPERACION in "+
                                " (SELECT OPE_ID_OPERACION FROM OPERACION_LINEA "+
                                "  WHERE OPE_ID_OPERACION = (SELECT OPE_ID_OPERACION FROM PAGO WHERE PAG_ID_PAGO = " + pago + ") and CLI_ID_CLIENTE  = " + cliente + ")) ";

                SqlCommand cmd = new SqlCommand(query, cnx);
                cnx.Open();
                using (SqlDataReader dr = cmd.ExecuteReader())
                {

                    List<Asiento> listaAsientos = new List<Asiento>();
                    while (dr.Read())
                    {

                        if (!Convert.IsDBNull(dr["ASI_ID_ASIENTO"]))
                        {
                            Asiento a = new Asiento()
                            {
                                idAsiento = int.Parse(dr["ASI_ID_ASIENTO"].ToString()),
                                numero = dr["ASI_NUMERO"].ToString(),
                                estadio = int.Parse(dr["EST_ID_ESTADIO"].ToString())
                            };
                            listaAsientos.Add(a);
                        }
                    }

                    return listaAsientos;
                }
            }
            catch (Exception e)
            {
                throw new InvalidOperationException("Error de conexiones  ");
            }

            finally
            {
                cnx.Close();
            }
            return null;
        }
    }
}